#ifndef CMD_TASK_H
#define CMD_TASK_H
#include<my_header.h>
#define MAX_FILE_SIZE 1024
#define BLOCK_SIZE (4 * 1024 * 1024) 

// 命令解析 
typedef enum {
	CMD_TYPE_INIT = -1,
	CMD_TYPE_CD = 1,
	CMD_TYPE_LS,
	CMD_TYPE_PWD,
	CMD_TYPE_MKDIR,
	CMD_TYPE_RMDIR,
	CMD_TYPE_REMOVE,
	CMD_TYPE_PUTS,
	CMD_TYPE_GETS,
  CMD_TYPE_QUIT,
  CMD_TYPE_HELP,
	// 无效命令
  CMD_TYPE_NOTCMD
} CmdType;

// 小火车任务协议
typedef struct train_s{
   // 任务的类型
   CmdType _cmdType;
   // 传输的长度
   int _trainLen;
   //传输的内容
   char _data[1024];
}train_t;

  // 任务的结构体
typedef struct task_S{
    // 传输的netfd
    int _netfd;
    // 小火车
    train_t _train;
    // 传输路径
    char *_dir[1024];
}task_t;

//判断新旧客户端连接的结构体
typedef struct accept_info_s{
  int is_new;//0是新客户端，1是读写子线程=
  char username[1024];//用户名
  char jwt[4096];
  size_t jwt_length;
}accept_info_t;

// 初始化任务
task_t* task_init(int netfd);

//客户端建立与服务器端的连接
int InitTcpconnect(char *ip,char *port);

// 加入监听
int EpollAdd(int epfd,int fd);
// 客户端删除监听
int EpollDel(int epfd,int fd);

//初始化连接结构体
int init_accept_info(accept_info_t * info);
  
// 客户端从标准输入中获取命令的类型
CmdType getcmdType(char *cmd);

// 客户端将输入至标准输入的字符串安装空格切分，存入字符串数组中
void splitString(char *stdinchar,const char *delimiter,char *tokens[]);

// 客户端解析命令
void parseCommand(char *tokens,task_t *task);

// 处理pwd命令
int handle_pwd(task_t *task);

int handle_ls(task_t *task);

// 客户端与服务器建立临时连接
int temp_connect(char *ip,char *port,accept_info_t *info);

//客户端上传文件
// int handle_puts(task_t *task);
void *handle_puts(void *arg);

//客户端下载文件
// int handle_gets(task_t *task);
void *handle_gets(void *arg);

#endif

